#include "KubaWaveform.h"

#include "Utils.h"
#include <sstream>
#include <cmath>

namespace RafMat
{
namespace SimEngine
{

using namespace std;
using namespace SimInterface;

KubaWaveform::KubaWaveform(SimInterface::ISimulator& sim,
                        double variance)
    : WaveformBase(sim, "Stairs", "stairs", 1, 0, 0, 0)
{
}

double KubaWaveform::getNextValue()
{
    const double points[] = { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8,
                              0.7, 0.6, 0.5, 0.4, 0.3, 0.2 };

    double t0 = getCurrentTime();

    double t = t0 - floor(t0 / 3000) * 3000;

    int index = Utils::limitValue<int>(ceil((t - 400.0) / 200.0), 0, 13);

    return points[index];
}

bool KubaWaveform::setParameter(const string& param, const string& value) throw(logic_error)
{
    // Usuń ewentualne wiodące i końcowe spacje
    string tparam = Utils::trimWhiteSpaces(param);
    string tvalue = Utils::trimWhiteSpaces(value);

    // Strumień danych dla łańcucha argumentu.
    istringstream istr(tvalue);

    //double tmpVal;

    return WaveformBase::setParameter(param, value);

    if(istr.bad())
    {
        throw iconf_error::syntaxError(*this, tvalue);
    }

    return true;
}

string KubaWaveform::getParameter(const string& param) const throw(logic_error)
{
    // Usuń ewentualne wiodące i końcowe spacje
    string tparam = Utils::trimWhiteSpaces(param);
    string outStr;

    // Strumień danych dla łańcucha argumentu.
    ostringstream ostr(outStr);

    return WaveformBase::getParameter(param);

    return ostr.str();
}

SimFile::ConfigWriter& KubaWaveform::dumpSpecificPar(SimFile::ConfigWriter& o) const
{
    return o;
}

}   // SimEngine namespace
}   // RafMat namespace
